/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package agb.Modelo;

import agb.Conexion.Conexion;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

/**
 *
 * @author Administrator
 */
public class Horarios {
    private String nombreCurso, horaInicio, horaFin, nombreGrago, nombreSeccion, nombreDia;
    private String nombreNivel, nombreProfesor, anio, lunes, martes, miercoles, jueves, viernes;
    private int codPersona, codMatricula, codCurso;
    private ArrayList<Horarios> horario = new ArrayList<Horarios>();

    public Horarios() {
        horario = new ArrayList<Horarios>();
    }

    public ArrayList<Horarios> getHorario() {
        return horario;
    }

    public void setHorario(ArrayList<Horarios> horario) {
        this.horario = horario;
    }

    public String getJueves() {
        return jueves;
    }

    public void setJueves(String jueves) {
        this.jueves = jueves;
    }

    public String getLunes() {
        return lunes;
    }

    public void setLunes(String lunes) {
        this.lunes = lunes;
    }

    public String getMartes() {
        return martes;
    }

    public void setMartes(String martes) {
        this.martes = martes;
    }

    public String getMiercoles() {
        return miercoles;
    }

    public void setMiercoles(String miercoles) {
        this.miercoles = miercoles;
    }

    public String getViernes() {
        return viernes;
    }

    public void setViernes(String viernes) {
        this.viernes = viernes;
    }

    /**
     * @return the nombreCurso
     */
    public String getNombreCurso() {
        return nombreCurso;
    }

    /**
     * @param nombreCurso the nombreCurso to set
     */
    public void setNombreCurso(String nombreCurso) {
        this.nombreCurso = nombreCurso;
    }

    /**
     * @return the horaInicio
     */
    public String getHoraInicio() {
        return horaInicio;
    }

    /**
     * @param horaInicio the horaInicio to set
     */
    public void setHoraInicio(String horaInicio) {
        this.horaInicio = horaInicio;
    }

    /**
     * @return the horaFin
     */
    public String getHoraFin() {
        return horaFin;
    }

    /**
     * @param horaFin the horaFin to set
     */
    public void setHoraFin(String horaFin) {
        this.horaFin = horaFin;
    }

    /**
     * @return the nombreGrago
     */
    public String getNombreGrago() {
        return nombreGrago;
    }

    /**
     * @param nombreGrago the nombreGrago to set
     */
    public void setNombreGrago(String nombreGrago) {
        this.nombreGrago = nombreGrago;
    }

    /**
     * @return the nombreSeccion
     */
    public String getNombreSeccion() {
        return nombreSeccion;
    }

    /**
     * @param nombreSeccion the nombreSeccion to set
     */
    public void setNombreSeccion(String nombreSeccion) {
        this.nombreSeccion = nombreSeccion;
    }

    /**
     * @return the nombreDia
     */
    public String getNombreDia() {
        return nombreDia;
    }

    /**
     * @param nombreDia the nombreDia to set
     */
    public void setNombreDia(String nombreDia) {
        this.nombreDia = nombreDia;
    }

    /**
     * @return the nombreNivel
     */
    public String getNombreNivel() {
        return nombreNivel;
    }

    /**
     * @param nombreNivel the nombreNivel to set
     */
    public void setNombreNivel(String nombreNivel) {
        this.nombreNivel = nombreNivel;
    }

    /**
     * @return the nombreProfesor
     */
    public String getNombreProfesor() {
        return nombreProfesor;
    }

    /**
     * @param nombreProfesor the nombreProfesor to set
     */
    public void setNombreProfesor(String nombreProfesor) {
        this.nombreProfesor = nombreProfesor;
    }

    /**
     * @return the anio
     */
    public String getAnio() {
        return anio;
    }

    /**
     * @param anio the anio to set
     */
    public void setAnio(String anio) {
        this.anio = anio;
    }

    /**
     * @return the codPersona
     */
    public int getCodPersona() {
        return codPersona;
    }

    /**
     * @param codPersona the codPersona to set
     */
    public void setCodPersona(int codPersona) {
        this.codPersona = codPersona;
    }
    /**
     * @return the codMatricula
     */
    public int getCodMatricula() {
        return codMatricula;
    }

    /**
     * @param codMatricula the codMatricula to set
     */
    public void setCodMatricula(int codMatricula) {
        this.codMatricula = codMatricula;
    }

        /**
     * @return the codCurso
     */
    public int getCodCurso() {
        return codCurso;
    }

    /**
     * @param codCurso the codCurso to set
     */
    public void setCodCurso(int codCurso) {
        this.codCurso = codCurso;
    }

   public static ArrayList<Horarios> HorarioDocentePorCodigoAnioAcademico(int codProfesor){
        ArrayList<Horarios> HorarioDocente = new ArrayList<Horarios>();
        Horarios oHorario = null;
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = " select c.nombre as NombreCurso, dh.dia as nombreDia, h.hora_inicio as HoraInicio, h.hora_termino as HoraFin        " +
                ",g.nombre as NombreGrado,a.nombre as NombreSeccion, n.nombre as NombreNivel, dh.cod_persona as codigoProfesor, dh.cod_curso " +
                "from detalle_horarioaula dh " +
                "inner join horario_aula ha on dh.cod_horario = ha.cod_horario " +
                "INNER JOIN aula a ON (a.cod_aula = ha.cod_aula) " +
                "inner join programacion_aula pa on ha.cod_progaula = pa.cod_progaula " +
                "inner join programacion_annoacademico pac on pa.cod_progannoacad = pac.cod_progannoacad " +
                "inner join curso c on dh.cod_curso = c.cod_curso " +
                "inner join hora h on dh.cod_hora = h.cod_hora  " +
                "INNER JOIN nivel_grado ng ON (ng.cod_nivelgrado = pa.cod_nivelgrado)  " +
                "INNER JOIN nivel n ON (n.cod_nivel = ng.cod_nivel)  " +
                "INNER JOIN grado g ON (g.cod_grado = ng.cod_grado) " +
                "where dh.cod_persona = ? and dh.cod_horario IN (     " +
                    "SELECT ha.cod_horario     " +
                    "FROM horario_aula ha     " +
                    "WHERE ha.cod_progaula IN (           " +
                        "SELECT pa.cod_progaula           " +
                        "FROM programacion_aula pa           " +
                        "WHERE pa.cod_progannoacad IN (                 " +
                            "select pac.cod_progannoacad                 " +
                            "from programacion_annoacademico pac                 " +
                            "where TO_CHAR(pac.fecha_inicio, 'YYYY') = "+ "yearP" + "(?)))) " +
                 "order by dh.dia, h.hora_inicio ; " ;
        try{
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, codProfesor);
            ps.setInt(2, codProfesor);
            rs = ps.executeQuery();
            while(rs.next()){
                oHorario = new Horarios();
                oHorario.setNombreCurso(rs.getString(1));
                oHorario.setNombreDia(rs.getString(2));
                oHorario.setHoraInicio(rs.getString(3));
                oHorario.setHoraFin(rs.getString(4));
                oHorario.setNombreGrago(rs.getString(5));
                oHorario.setNombreSeccion(rs.getString(6));
                oHorario.setNombreNivel(rs.getString(7));
                
                HorarioDocente.add(oHorario);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return HorarioDocente;
   }
   
   
   
   public ArrayList<Horarios> HorarioDocentePorCodigoPersonaProfesor(int codProfesor){
        ArrayList<Horarios> HorarioDocente = new ArrayList<Horarios>();
        Horarios oHorario = null;
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = " SELECT schedule.horaInicio,schedule.horaFin,MAX(schedule.LUNES) AS LUNES,MAX(schedule.MARTES) AS MARTES,MAX(schedule.MIERCOLES) AS MIERCOLES,MAX(schedule.JUEVES) AS JUEVES,MAX(schedule.VIERNES) AS VIERNES "
                + "FROM( "
                    + "SELECT h.hora_inicio as HoraInicio, h.hora_termino as HoraFin, "
                    + "CASE WHEN dh.dia = 'LUNES' THEN c.nombre || ' <BR> ' || g.nombre  || ' - ' || a.nombre || ' <BR> ' || n.nombre ELSE '' END AS LUNES, "
                    + "CASE WHEN dh.dia = 'MARTES' THEN c.nombre || ' <BR> ' || g.nombre  || ' - ' || a.nombre || ' <BR> ' || n.nombre ELSE '' END AS MARTES, "
                    + "CASE WHEN dh.dia = 'MIERCOLES' THEN c.nombre || ' <BR> ' || g.nombre  || ' - ' || a.nombre || ' <BR> ' || n.nombre ELSE '' END AS MIERCOLES, "
                    + "CASE WHEN dh.dia = 'JUEVES' THEN c.nombre || ' <BR> ' || g.nombre  || ' - ' || a.nombre || ' <BR> ' || n.nombre  END AS JUEVES, "
                    + "CASE WHEN dh.dia = 'VIERNES' THEN c.nombre || ' <BR> ' || g.nombre  || ' - ' || a.nombre || ' <BR> ' || n.nombre  END AS VIERNES                 "
                    + "from detalle_horarioaula dh                 "
                    + "inner join horario_aula ha on dh.cod_horario = ha.cod_horario                 "
                    + "INNER JOIN aula a ON (a.cod_aula = ha.cod_aula)                 "
                    + "inner join programacion_aula pa on ha.cod_progaula = pa.cod_progaula                 "
                    + "inner join programacion_annoacademico pac on pa.cod_progannoacad = pac.cod_progannoacad                 "
                    + "inner join curso c on dh.cod_curso = c.cod_curso                 "
                    + "inner join hora h on dh.cod_hora = h.cod_hora                 "
                    + "INNER JOIN nivel_grado ng ON (ng.cod_nivelgrado = pa.cod_nivelgrado)                 "
                    + "INNER JOIN nivel n ON (n.cod_nivel = ng.cod_nivel)                 "
                    + "INNER JOIN grado g ON (g.cod_grado = ng.cod_grado)                 "
                    + "where dh.cod_persona = ? and dh.cod_horario IN (                     "
                        + "SELECT ha.cod_horario                     "
                        + "FROM horario_aula ha                     "
                        + "WHERE ha.cod_progaula IN (                         "
                            + "SELECT pa.cod_progaula                         "
                            + "FROM programacion_aula pa                         "
                            + "WHERE pa.cod_progannoacad IN (                             "
                                + "select pac.cod_progannoacad                             "
                                + "from programacion_annoacademico pac                             "
                                + "where TO_CHAR(pac.fecha_inicio, 'YYYY') = yearP (?))))                  "
                    + "order by dh.dia, h.hora_inicio) AS schedule "
                + "GROUP BY schedule.horaInicio,schedule.horaFin "
                + "ORDER BY schedule.horaInicio,schedule.horaFin" ;
        try{
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, codProfesor);
            ps.setInt(2, codProfesor);
            rs = ps.executeQuery();
            while(rs.next()){
                oHorario = new Horarios();
                oHorario.setHoraInicio(rs.getString(1));
                oHorario.setHoraFin(rs.getString(2));
                oHorario.setLunes(rs.getString(3));
                oHorario.setMartes(rs.getString(4));
                oHorario.setMiercoles(rs.getString(5));
                oHorario.setJueves(rs.getString(6));
                oHorario.setViernes(rs.getString(7));
                HorarioDocente.add(oHorario);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return HorarioDocente;
   }


   public static ArrayList<Horarios> HorarioAlumnoPorCodigoAñoMatricula(int codAlumno){
        ArrayList<Horarios> HorarioDocente = new ArrayList<Horarios>();
        Horarios oHorario = null;
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "select m.cod_matricula as codigoMatricula,c.nombre as nombreCurso, h.hora_inicio as horaInicio, " +
                "h.hora_termino as horaFin, dha.dia as nombreDia,g.nombre as nombreGrado, a.nombre as nombreSeccion, " +
                "n.nombre as nombreNivel, dha.cod_curso, pn.apell_paterno || ' ' || pn.apell_materno || ', '  || pn.primer_nombre as nombreDocente " +
                "from matricula m " +
                "inner join aula a on m.cod_aula = a.cod_aula " +
                "inner join programacion_aula pa on pa.cod_progaula = m.cod_progaula " +
                "inner join nivel_grado ng on pa.cod_nivelgrado = ng.cod_nivelgrado " +
                "inner join nivel n on n.cod_nivel = ng.cod_nivel " +
                "inner join grado g on g.cod_grado = ng.cod_grado " +
                "inner join horario_aula ha on ha.cod_progaula = pa.cod_progaula " +
                "inner join detalle_horarioaula dha on ha.cod_horario = dha.cod_horario  " +
                "inner join p_natural pn on pn.cod_persona = dha.cod_persona " +
                "inner join hora h on h.cod_hora = dha.cod_hora " +
                "inner join curso c on c.cod_curso = dha.cod_curso " +
                "where m.cod_persona = ? and TO_CHAR(m.fecha_registro, 'YYYY') = year(?) " +
                "and ha.cod_aula in (" +
                    "select m2.cod_aula                   " +
                    "from matricula m2                   " +
                    "where m2.cod_persona = ? and TO_CHAR(m2.fecha_registro, 'YYYY') = year(?)) " +
                    "and ha.cod_horario in (" +
                        "select dh.cod_horario " +
                        "from detalle_horarioaula dh " +
                        "where dh.cod_horario = ha.cod_horario) " +
                "order by dha.dia, h.hora_inicio" ;
        try{
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, codAlumno);
            ps.setInt(2, codAlumno);
            ps.setInt(3, codAlumno);
            ps.setInt(4, codAlumno);
            rs = ps.executeQuery();
            while(rs.next()){
                oHorario = new Horarios();
                oHorario.setCodMatricula(rs.getInt(1));
                oHorario.setNombreCurso(rs.getString(2));
                oHorario.setHoraInicio(rs.getString(3));
                oHorario.setHoraFin(rs.getString(4));
                oHorario.setNombreDia(rs.getString(5));
                oHorario.setNombreGrago(rs.getString(6));
                oHorario.setNombreSeccion(rs.getString(7));
                oHorario.setNombreNivel(rs.getString(8));
                oHorario.setCodCurso(rs.getInt(9));
                oHorario.setNombreProfesor(rs.getString(10));
                HorarioDocente.add(oHorario);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return HorarioDocente;
    }
   
   
   public ArrayList<Horarios> HorarioAlumnoPorCodigoPersona(int codAlumno, int codNivel){
       System.out.println("A");
        Connection cn = null;
        PreparedStatement ps = null;
        boolean rs = false;
       System.out.println("B"); 
        String sql = "CREATE TEMP TABLE HORARIOS AS "
                + "SELECT schedule.horaInicio,schedule.horaFin,MAX(schedule.LUNES) AS LUNES,MAX(schedule.MARTES) AS MARTES,MAX(schedule.MIERCOLES) AS MIERCOLES,MAX(schedule.JUEVES) AS JUEVES,MAX(schedule.VIERNES) AS VIERNES "
                + "FROM(    "
                    + "select  h.hora_inicio as horaInicio, h.hora_termino as horaFin, "
                    + "CASE WHEN dha.dia = 'LUNES' THEN c.nombre  || ' <br> ' || pn.apell_paterno || ' ' || pn.apell_materno || ', '  || pn.primer_nombre ELSE '' END AS LUNES, "
                    + "CASE WHEN dha.dia = 'MARTES' THEN c.nombre  || ' <br> ' || pn.apell_paterno || ' ' || pn.apell_materno || ', '  || pn.primer_nombre ELSE '' END AS MARTES, "
                    + "CASE WHEN dha.dia = 'MIERCOLES' THEN c.nombre  || ' <br> ' || pn.apell_paterno || ' ' || pn.apell_materno || ', '  || pn.primer_nombre ELSE '' END AS MIERCOLES, "
                    + "CASE WHEN dha.dia = 'JUEVES' THEN c.nombre  || ' <br> ' || pn.apell_paterno || ' ' || pn.apell_materno || ', '  || pn.primer_nombre  END AS JUEVES, "
                    + "CASE WHEN dha.dia = 'VIERNES' THEN c.nombre  || ' <br> ' || pn.apell_paterno || ' ' || pn.apell_materno || ', '  || pn.primer_nombre  END AS VIERNES "
                    + "from matricula m "
                    + "inner join aula a on m.cod_aula = a.cod_aula "
                    + "inner join programacion_aula pa on pa.cod_progaula = m.cod_progaula "
                    + "inner join nivel_grado ng on pa.cod_nivelgrado = ng.cod_nivelgrado "
                    + "inner join nivel n on n.cod_nivel = ng.cod_nivel "
                    + "inner join grado g on g.cod_grado = ng.cod_grado "
                    + "inner join horario_aula ha on ha.cod_progaula = pa.cod_progaula "
                    + "inner join detalle_horarioaula dha on ha.cod_horario = dha.cod_horario "
                    + "inner join p_natural pn on pn.cod_persona = dha.cod_persona "
                    + "inner join hora h on h.cod_hora = dha.cod_hora "
                    + "inner join curso c on c.cod_curso = dha.cod_curso "
                    + "where m.cod_persona = ? "
                    + "and TO_CHAR(m.fecha_registro, 'YYYY') = year(?) "
                    + "and ha.cod_aula in (     "
                        + "select m2.cod_aula     "
                        + "from matricula m2     "
                        + "where m2.cod_persona = ? and "
                        + "TO_CHAR(m2.fecha_registro, 'YYYY') = year(?))     "
                        + "and ha.cod_horario in (         "
                            + "select dh.cod_horario         "
                            + "from detalle_horarioaula dh         "
                            + "where dh.cod_horario = ha.cod_horario) "
                    + "order by dha.dia, h.hora_inicio) AS schedule "
                + "GROUP BY schedule.horaInicio,schedule.horaFin "
                + "ORDER BY schedule.horaInicio,schedule.horaFin" ;         
        try{ 
//            System.out.println("A");
            
//            System.out.println("B");
            cn = Conexion.getConexion();
            cn.setAutoCommit(false);
            ps = cn.prepareStatement(sql);
            ps.setInt(1, codAlumno);
            ps.setInt(2, codAlumno);
            ps.setInt(3, codAlumno);
            ps.setInt(4, codAlumno);
            rs = ps.executeUpdate()>=0?true:false;
            if(rs){
                System.out.println("aaa");
                registraBreaks(codNivel, cn);
            }else{
                Conexion.anularTransaccion(cn);
            }
      
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return getHorario();
    }
   
   public  boolean registraBreaks(int nivel,Connection cn){
        boolean rpta = false;
        PreparedStatement ps = null;
        List<String> breaks = new ArrayList<String>();
        String sql = "";
        if(nivel==4){
            sql = "INSERT INTO HORARIOS "
                + "VALUES('10:30:00','11:00:00','BREAK','BREAK','BREAK','BREAK','BREAK')" ;
            breaks.add(sql);
        }else{
            sql = "INSERT INTO HORARIOS "
                + "VALUES('11:05:00','11:20:00','BREAK','BREAK','BREAK','BREAK','BREAK')" ;
            breaks.add(sql);
            sql = "INSERT INTO HORARIOS "
                + "VALUES('09:10:00','09:25:00','BREAK','BREAK','BREAK','BREAK','BREAK')" ;
            breaks.add(sql);
        }
        
        try{
            
            
            for (int i = 0; i < breaks.size(); i++) {
                String string = breaks.get(i);
                 ps = cn.prepareStatement(string);
                rpta = ps.executeUpdate()==1?true:false;
                if(!rpta){
                    break;
                }
            }
           
            if(rpta){
                horarioAlumno(cn);
            }else{
                Conexion.anularTransaccion(cn);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return rpta;
    }
   
   public void horarioAlumno(Connection cn){
        ArrayList<Horarios> HorarioDocente = new ArrayList<Horarios> ();
        Horarios oHorario = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT horainicio, horafin, lunes, martes, miercoles, jueves, viernes  "
                + "FROM HORARIOS "
                + "ORDER BY HORAINICIO,HORAFIN" ;
        try{
            
            ps = cn.prepareStatement(sql);
            rs = ps.executeQuery();
            while(rs.next()){
                oHorario = new Horarios();
                oHorario.setHoraInicio(rs.getString(1));
                oHorario.setHoraFin(rs.getString(2));
                oHorario.setLunes(rs.getString(3));
                oHorario.setMartes(rs.getString(4));
                oHorario.setMiercoles(rs.getString(5));
                oHorario.setJueves(rs.getString(6));
                oHorario.setViernes(rs.getString(7));
                HorarioDocente.add(oHorario);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);    
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        setHorario(HorarioDocente);         
    }

   public static Vector<Horarios> NombreDocentePorAñoAcademico(int codAlumno, int anioMatricula){
        Vector<Horarios> HorarioDocente = new Vector<Horarios>();
        Horarios oHorario = null;
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "select m.cod_matricula as codigoMatricula,c.nombre as nombreCurso, h.hora_inicio as horaInicio, " +
                "h.hora_termino as horaFin, dha.dia as nombreDia,g.nombre as nombreGrado, a.nombre as nombreSeccion, n.nombre as nombreNivel " +
                "from matricula m " +
                "inner join aula a on m.cod_aula = a.cod_aula " +
                "inner join programacion_aula pa on pa.cod_progaula = m.cod_progaula " +
                "inner join nivel_grado ng on pa.cod_nivelgrado = ng.cod_nivelgrado " +
                "inner join nivel n on n.cod_nivel = ng.cod_nivel " +
                "inner join grado g on g.cod_grado = ng.cod_grado " +
                "inner join horario_aula ha on ha.cod_progaula = pa.cod_progaula " +
                "inner join detalle_horarioaula dha on ha.cod_horario = dha.cod_horario " +
                "inner join hora h on h.cod_hora = dha.cod_hora " +
                "inner join curso c on c.cod_curso = dha.cod_curso " +
                "where m.cod_persona = ? and TO_CHAR(m.fecha_registro, 'YYYY') = ? " +
                "and ha.cod_aula in (" +
                    "select m.cod_aula                   " +
                    "from matricula m                   " +
                    "where m.cod_persona = ? ) " +
                    "and ha.cod_horario in (" +
                        "select dh.cod_horario " +
                        "from detalle_horarioaula dh " +
                        "where dh.cod_horario = ha.cod_horario) " +
                "order by dha.dia, h.hora_inicio" ;
        try{
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, codAlumno);
            ps.setInt(2, anioMatricula);
            ps.setInt(3, codAlumno);
            rs = ps.executeQuery();
            while(rs.next()){
                oHorario = new Horarios();
                oHorario.setCodMatricula(rs.getInt(1));
                oHorario.setNombreCurso(rs.getString(2));
                oHorario.setHoraInicio(rs.getString(3));
                oHorario.setHoraFin(rs.getString(4));
                oHorario.setNombreDia(rs.getString(5));
                oHorario.setNombreGrago(rs.getString(6));
                oHorario.setNombreSeccion(rs.getString(7));
                oHorario.setNombreNivel(rs.getString(8));
                HorarioDocente.add(oHorario);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);    
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return HorarioDocente;
    }


public static ArrayList<Horarios> listaCursosAlumnoSegunHorario(int codPersonaAlumno){
        ArrayList<Horarios> HorarioDocente = new ArrayList<Horarios>();
        Horarios oHorario = null;
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = " select DISTINCT c.cod_curso, c.nombre as nombreCurso " +
                "from matricula m " +
                "inner join programacion_aula pa on pa.cod_progaula = m.cod_progaula " +
                "inner join horario_aula ha on ha.cod_progaula = pa.cod_progaula " +
                "inner join detalle_horarioaula dha on ha.cod_horario = dha.cod_horario " +
                "inner join curso c on c.cod_curso = dha.cod_curso " +
                "where m.cod_persona = ? " +
                "and TO_CHAR(m.fecha_registro, 'YYYY') = year(?) " +
                
                "and ha.cod_aula in (" +
                    "select m.cod_aula                   " +
                    "from matricula m2                   " +
                    "where m2.cod_persona = ? " +
                    "and TO_CHAR(m2.fecha_registro, 'YYYY') = year(?)) " +
                    
                    "and ha.cod_horario in (" +
                        "select dh.cod_horario                       " +
                        "from detalle_horarioaula dh                       " +
                        "where dh.cod_horario = ha.cod_horario) " +
                 "order by c.nombre " ;
        try{
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, codPersonaAlumno);
            ps.setInt(2, codPersonaAlumno);
            ps.setInt(3, codPersonaAlumno);
            ps.setInt(4, codPersonaAlumno);
            rs = ps.executeQuery();
            while(rs.next()){
                oHorario = new Horarios();
                oHorario.setCodCurso(rs.getInt(1));
                oHorario.setNombreCurso(rs.getString(2));
                HorarioDocente.add(oHorario);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return HorarioDocente;
   }

}
